#include "u_Task.h"
#include "bsp_port.h"
#include "bsp_Timer.h"
#include "User_App.h"

extern bsp_TIM_t Ti_BEEP;
extern bsp_TIM_t Ti_Info;
extern bsp_TIM_t Ti_Heat_Tim;

#if 1

static u_Task_e u_HeatWater_Enter_Start(void);
static u_Task_e u_HeatWater_Enter_End(void);
static u_Task_e u_HeatWater_Enter_Pause(void);
static u_Task_e u_HeatWater_Enter_Renew(void);
static u_Task_e u_HeatWater_Heat_Start(void);
static u_Task_e u_HeatWater_Heat_End(void);
static u_Task_e u_HeatWater_Heat_Pause(void);
static u_Task_e u_HeatWater_Heat_Renew(void);
static u_Task_e u_HeatWater_Stop_Event(void);
static u_Task_e u_HeatWater_Err_Event(void);

#endif

// 烧水加热任务
u_Task_t HeatWater = {
    .t_State = t_STOP,
    .t_Num = 2,
    .t_TaskNode[0] = {
        // 进水
        .ta_TimeOut = 10000,
        .u_Task_Handle[U_START] = u_HeatWater_Enter_Start,
        .u_Task_Handle[U_END] = u_HeatWater_Enter_End,
        .u_Task_Handle[U_PAUSE] = u_HeatWater_Enter_Pause,
        .u_Task_Handle[U_RENEW] = u_HeatWater_Enter_Renew,
    },
    .t_TaskNode[1] = {
        // 加热
        .ta_TimeOut = 10000,
        .u_Task_Handle[U_START] = u_HeatWater_Heat_Start,
        .u_Task_Handle[U_END] = u_HeatWater_Heat_End,
        .u_Task_Handle[U_PAUSE] = u_HeatWater_Heat_Pause,
        .u_Task_Handle[U_RENEW] = u_HeatWater_Heat_Renew,
    },
    .t_StopEvent = u_HeatWater_Stop_Event,
    .t_ErrEvent = u_HeatWater_Err_Event,
};

static u_Task_e u_HeatWater_Enter_Start(void)
{

    bsp_Ctrl_Heat_Switch(s_CLOSE); // 加热控制 关
    Ti_obj_Set_Stop(&Ti_Heat_Tim); // 停止1s时间基准定时器

    bsp_Set_Beep(1 * 2 + 1); // 蜂鸣一声

    // 水壶检测
    if (info.m_KettleFlag == 1)
    {
        // 防溢出
        if (info.m_SpillFlag == 1)
        {
            bsp_Ctrl_Water_Valve(s_CLOSE);      // 水阀控制 关
            bsp_Ctrl_Flowmeter_Switch(s_CLOSE); // 流量计控制 关
            return t_ERR;
        }
        else
        {
            HeatWater.t_Countdown = info.m_Set_Water_Volume * 200;
            info.m_Now_Water_Volume = info.m_Set_Water_Volume; // 设定水量
            bsp_Ctrl_Water_Valve(s_OPEN);                      // 水阀控制 开
            bsp_Ctrl_Flowmeter_Switch(s_OPEN);                 // 流量计控制 开
            return t_OK;
        }
    }
    else
    {
        return t_ERR;
    }
}
static u_Task_e u_HeatWater_Enter_End(void)
{
    // 溢出检测
    if (info.m_SpillFlag == 1 || info.m_KettleFlag == 0)
    {
        return t_ERR;
    }

    // 确保设定水量已经全部进入壶内
    if (info.m_Now_Water_Volume == 0)
    {
        bsp_Ctrl_Water_Valve(s_CLOSE);      // 水阀控制 关
        bsp_Ctrl_Flowmeter_Switch(s_CLOSE); // 流量计控制 关
        bsp_Ti_Set_mDelay(1000);
        return t_OK;
    }

    return t_NOK;
}
static u_Task_e u_HeatWater_Enter_Pause(void)
{
    bsp_Ctrl_Water_Valve(s_CLOSE);      // 水阀控制 关
    bsp_Ctrl_Flowmeter_Switch(s_CLOSE); // 流量计控制 关
    return t_OK;
}
static u_Task_e u_HeatWater_Enter_Renew(void)
{
    // 不溢出 并且 还有水没有进入壶内
    if (info.m_SpillFlag == 0 && info.m_Now_Water_Volume > 0)
    {
        bsp_Ctrl_Water_Valve(s_OPEN);      // 水阀控制 开
        bsp_Ctrl_Flowmeter_Switch(s_OPEN); // 流量计控制 开
    }

    return t_OK;
}

static u_Task_e u_HeatWater_Heat_Start(void)
{
    if (bsp_Ti_Get_mDelay() == 0)
    {
        HeatWater.t_Countdown = info.m_Set_Heat_Tim * 1000 + 2000;
        info.m_Now_Heat_Tim = info.m_Set_Heat_Tim; // 设置加热时间

        bsp_Ctrl_Heat_Switch(s_OPEN); // 加热控制 开
        Ti_obj_Set_Run(&Ti_Heat_Tim); // 运行1s时间基准定时器
        return t_OK;
    }
    else
    {
        return t_NOK;
    }
}
static u_Task_e u_HeatWater_Heat_End(void)
{
    // 溢出检测
    if (info.m_SpillFlag == 1 || info.m_KettleFlag == 0)
    {
        return t_ERR;
    }

    if (info.m_Now_Heat_Tim == 0) // 温度达到设定值
    {
        bsp_Ctrl_Heat_Switch(s_CLOSE); // 加热控制 关
        Ti_obj_Set_Stop(&Ti_Heat_Tim); // 停止1s时间基准定时器
        bsp_Set_Beep(1 * 2 + 1);       // 蜂鸣一声
        return t_OK;
    }

    return t_NOK;
}
static u_Task_e u_HeatWater_Heat_Pause(void)
{
    bsp_Ctrl_Heat_Switch(s_CLOSE); // 加热控制 关
    Ti_obj_Set_Stop(&Ti_Heat_Tim); // 停止1s时间基准定时器

    return t_OK;
}
static u_Task_e u_HeatWater_Heat_Renew(void)
{
    if (info.m_Now_Heat_Tim > 0) // 温度达到设定值
    {
        bsp_Ctrl_Heat_Switch(s_OPEN); // 加热控制 开
        Ti_obj_Set_Run(&Ti_Heat_Tim); // 运行1s时间基准定时器
    }

    return t_OK;
}

static u_Task_e u_HeatWater_Stop_Event(void)
{
    bsp_Ctrl_Water_Valve(s_CLOSE);      // 水阀控制 关
    bsp_Ctrl_Heat_Switch(s_CLOSE);      // 加热控制 关
    Ti_obj_Set_Stop(&Ti_Heat_Tim);      // 停止1s时间基准定时器
    bsp_Ctrl_Flowmeter_Switch(s_CLOSE); // 流量计控制 关

    return t_OK;
}
static u_Task_e u_HeatWater_Err_Event(void)
{
    bsp_Ctrl_Water_Valve(s_CLOSE);      // 水阀控制 关
    bsp_Ctrl_Heat_Switch(s_CLOSE);      // 加热控制 关
    Ti_obj_Set_Stop(&Ti_Heat_Tim);      // 停止1s时间基准定时器
    bsp_Ctrl_Flowmeter_Switch(s_CLOSE); // 流量计控制 关
    bsp_Set_Beep(2 * 2 + 1); // 蜂鸣两声


    return t_OK;
}

uint8_t u_Task_Switch;
/*  @brief  任务运行调试
    @return 无
    @property 无
*/
void u_Task_Debug(void)
{
    bsp_Task_Obj_New(&HeatWater);

    while (1)
    {
        bsp_Task_Handle();

        switch (u_Task_Switch)
        {
        case 1:
            bsp_Task_Obj_Set_Run(&HeatWater);
            break;
        case 2:
            bsp_Task_Obj_Set_Pause(&HeatWater);
            break;
        case 3:
            bsp_Task_Obj_Set_Renew(&HeatWater);
            break;
        case 4:
            bsp_Task_Obj_Set_Stop(&HeatWater);
            break;
        default:
            break;
        }
        u_Task_Switch = 0;
    }
}
